
package com.bawei.dongyoufa_common.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author 作者 :dongyoufa
 * @version 
 * @Date 创建时间：2020-11-18 12:49:44
 * @Description 类说明 : 流处理工具类 
 */
public class StreamUtil {

	/**
	 * 
	 * @Title: closings
	 * @Description 方法的作用 : 批量关闭流
	 * @param 参数 :@param closeables
	 * @param 参数 :@throws Exception
	 * @return 返回类型 :void
	 * @throws
	 */
	public static void closings(AutoCloseable... closeables) throws Exception {
		// 非空判断
		if (closeables != null) {
			// 循环关闭
			for (AutoCloseable auto : closeables) {
				// 非空判断
				if (auto != null) {
					auto.close();
				}
			}
		}
	}

	/**
	 * 
	 * @Title: copy
	 * @Description 方法的作用 : 流处理，默认不关闭流
	 * @param 参数 :@param inputStream
	 * @param 参数 :@param outputStream
	 * @param 参数 :@throws Exception
	 * @return 返回类型 :void
	 * @throws
	 */
	public static void copy(InputStream inputStream, OutputStream outputStream) throws Exception {
		copy(inputStream, outputStream, false, false);
	}

	/**
	 * 
	 * @Title: copy
	 * @Description 方法的作用 : 流处理，用户可以选择是否关闭流
	 * @param 参数 :@param inputStream
	 * @param 参数 :@param outputStream
	 * @param 参数 :@param closeInputStream
	 * @param 参数 :@param closeOutputStream
	 * @param 参数 :@throws Exception
	 * @return 返回类型 :void
	 * @throws
	 */
	public static void copy(InputStream inputStream, OutputStream outputStream, boolean closeInputStream,
			boolean closeOutputStream) throws Exception {

		// 用于复制的字节数组
		byte[] b = new byte[1024];

		int len = 0;

		// 复制，如果讀取到的數據 >0 ,證明讀取到了數據
		while ((len = inputStream.read(b)) > 0) {
			// 将数据写入输出流
			outputStream.write(b, 0, len);
		}

		// 关闭流
		if (closeInputStream) {
			closings(inputStream);
		}
		if (closeOutputStream) {
			closings(outputStream);
		}
	}

	/**
	 * 
	 * @Title: asString
	 * @Description 方法的作用 : 读取文本流，也可以将流转成字符串，默认编码为UTF-8
	 * @param 参数 :@param inputStream
	 * @param 参数 :@return
	 * @param 参数 :@throws Exception
	 * @return 返回类型 :String
	 * @throws
	 */
	public static String asString(InputStream inputStream) throws Exception {
		return asString(inputStream, true);
	}

	/**
	 * 
	 * @Title: asString
	 * @Description 方法的作用 : 读取文本流，也可以将流转成字符串，默认编码为UTF-8
	 * @param 参数 :@param inputStream
	 * @param 参数 :@param isClose
	 * @param 参数 :@return
	 * @param 参数 :@throws Exception
	 * @return 返回类型 :String
	 * @throws
	 */
	public static String asString(InputStream inputStream, boolean isClose) throws Exception {
		return asString(inputStream, "UTF-8", true);
	}

	/**
	 * 
	 * @Title: asString
	 * @Description 方法的作用 : 读取文本流，也可以将流转成字符串
	 * @param 参数 :@param inputStream
	 * @param 参数 :@param encode
	 * @param 参数 :@param isClose
	 * @param 参数 :@return
	 * @param 参数 :@throws Exception
	 * @return 返回类型 :String
	 * @throws
	 */
	public static String asString(InputStream inputStream, String encode, boolean isClose) throws Exception {
		// 存放结果
		StringBuffer sb = new StringBuffer();

		// 用于复制的字节数组
		byte[] b = new byte[1024];

		int len = 0;

		// 复制，如果读取的个数 > 0，证明读取到了数据
		while ((len = inputStream.read(b)) > 0) {
			// 将数据写入StringBuffer
			sb.append(new String(b, 0, len, encode));
		}

		// 关流
		if (isClose) {
			closings(inputStream);
		}
		return sb.toString();
	}

	/**
	 * 
	 * @Title: asString
	 * @Description 方法的作用 : 读取文本文件，默认编码为UTF-8
	 * @param 参数 :@param textFile
	 * @param 参数 :@return
	 * @param 参数 :@throws Exception
	 * @return 返回类型 :String
	 * @throws
	 */
	public static String asString(File textFile) throws Exception {
		return asString(new FileInputStream(textFile));
	}

	/**
	 * 
	 * @Title: asString
	 * @Description 方法的作用 : 读取文本文件，默认编码为UTF-8
	 * @param 参数 :@param textFile
	 * @param 参数 :@param isClose
	 * @param 参数 :@return
	 * @param 参数 :@throws Exception
	 * @return 返回类型 :String
	 * @throws
	 */
	public static String asString(File textFile, boolean isClose) throws Exception {
		return asString(new FileInputStream(textFile), isClose);
	}

	/**
	* 功能：读取文本文件，可以指定编码
	*
	* @param File textFile 文本文件
	* @param String encoding 指定编码
	* @param boolean isClose 读完后是否关闭流
	*
	* @return 字符串
	 * @throws Exception 
	*/
	public static String asString(File textFile, String encode, boolean isClose) throws Exception {
		return asString(new FileInputStream(textFile), encode, isClose);
	}

	/**
	 * 
	 * @Title: readingLineFormTextFile
	 * @Description 方法的作用 : 按行读取文本文件，返回一个List集合，默认编码为UTF-8，默认关闭流
	 * @param 参数 :@param textFile
	 * @param 参数 :@return
	 * @param 参数 :@throws Exception
	 * @return 返回类型 :List<String>
	 * @throws
	 */
	public static List<String> readingLineFormTextFile(File textFile) throws Exception {
		return readingLineFormTextFile(textFile, "UTF-8");
	}

	/**
	 * 
	 * @Title: readingLineFormTextFile
	 * @Description 方法的作用 : 按行读取文本文件，返回一个List集合，默认编码为UTF-8
	 * @param 参数 :@param textFile
	 * @param 参数 :@param encode
	 * @param 参数 :@return
	 * @param 参数 :@throws Exception
	 * @return 返回类型 :List<String>
	 * @throws
	 */
	public static List<String> readingLineFormTextFile(File textFile, String encode) throws Exception {

		// 存放结果
		List<String> list = new ArrayList<String>();
		
		// 字符输入流
		FileReader fr = new FileReader(textFile);

		// 缓冲字符输入流
		BufferedReader br = new BufferedReader(fr);

		// 用于存入复制的数据
		String str = null;

		// 复制，如果读取的不为空，证明读取到了数据
		while ((str = br.readLine()) != null) {
			list.add(str);
		}

		// 关流
		closings(br);
		closings(fr);

		return list;
	}
}
